package com.minimalist.lindi.mapper;

import com.minimalist.common.entity.lindi.po.LindiPriceConfig;
import com.minimalist.common.entity.lindi.vo.priceconfig.LindiPriceConfigQueryVO;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import org.springframework.util.StringUtils;

/**
 * 林地指标交易平台_价格配置表 映射层。
 *
 * @author 11987
 * @since 2025-07-09
 */
public interface LindiPriceConfigMapper extends BaseMapper<LindiPriceConfig>{

    /**
     * 根据价格配置ID查询价格配置
     *
     * @param priceConfigId 价格配置ID
     * @return 价格配置
     */
    default LindiPriceConfig selectPriceConfigByPriceConfigId(Long priceConfigId){
        return selectOneByQuery(QueryWrapper.create()
                .eq(LindiPriceConfig::getPriceConfigId, priceConfigId));
    }

    /**
     * 根据价格配置ID删除价格配置
     *
     * @param priceConfigId 价格配置ID
     */
    default void deletePriceConfigByPriceConfigId(Long priceConfigId){
        deleteByQuery(QueryWrapper.create().eq(LindiPriceConfig::getPriceConfigId, priceConfigId));
    }

    /**
     * 根据价格配置ID更新价格配置
     *
     * @param newPriceConfig 价格配置
     */
    default void updatePriceConfigByPriceConfigId(LindiPriceConfig newPriceConfig){
        updateByQuery(newPriceConfig, QueryWrapper.create()
                .eq(LindiPriceConfig::getPriceConfigId, newPriceConfig.getPriceConfigId()));
    }

    /**
     * 分页查询价格配置列表
     *
     * @param queryVO 价格配置查询条件
     * @return 价格配置分页列表
     */
    default Page<LindiPriceConfig> selectPagePriceConfigList(LindiPriceConfigQueryVO queryVO){
        return paginate(queryVO.getPageNum(), queryVO.getPageSize(),
                QueryWrapper.create()
                        .select()
                        .from(LindiPriceConfig.class)
                        .eq(LindiPriceConfig::getPriceType, queryVO.getPriceType(), StringUtils.hasText(queryVO.getPriceType()))
                        .ge(LindiPriceConfig::getEffectiveDate, queryVO.getEffectiveDate(), queryVO.getEffectiveDate() != null)
                        .le(LindiPriceConfig::getExpireDate, queryVO.getExpireDate(), queryVO.getExpireDate() != null)
                        .orderBy(LindiPriceConfig::getId, false));
    }

    /**
     * 根据价格类型查询指定时间有效的价格配置
     *
     * @param priceType 价格类型
     * @param queryTime 查询时间
     * @return 价格配置
     */
    default LindiPriceConfig selectValidPriceConfigByType(String priceType, java.time.LocalDateTime queryTime){
        java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf(queryTime);

        return selectOneByQuery(QueryWrapper.create()
                .eq(LindiPriceConfig::getPriceType, priceType)
                .le(LindiPriceConfig::getEffectiveDate, timestamp)
                // 过期时间为null（永不过期）或者过期时间大于等于查询时间
                .isNull(LindiPriceConfig::getExpireDate)
                .or(LindiPriceConfig::getExpireDate).ge(timestamp)
                .orderBy(LindiPriceConfig::getEffectiveDate, false)
                .limit(1));
    }

}
